//package com.ophiux.lock.redis.aspect;
//
//import java.util.Objects;
//import java.util.concurrent.TimeUnit;
//
//import com.ophiux.lock.redis.annotation.Repeat;
//import com.ophiux.lock.redis.client.RedissonLockClient;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
//import org.springframework.stereotype.Component;
//
///**
// * @desc: 防止重复提交分布式锁拦截器
// * @author: hhl
// * @date：2021/10/30 17:09
// */
//@Aspect
//public class RepeatSubmitAspect extends BaseAspect{
//
//	@Autowired
//    private RedissonLockClient redissonLockClient;
//
//    /***
//     * 定义controller切入点拦截规则，拦截Repeat注解的业务方法
//     */
//    @Pointcut("@annotation(repeat)")
//    public void pointCut(Repeat repeat) {
//    }
//
//    /**
//     * AOP分布式锁拦截
//     *
//     * @param joinPoint
//     * @return
//     * @throws Exception
//     */
//    @Around("pointCut(repeat)")
//    public Object repeatSubmit(ProceedingJoinPoint joinPoint,Repeat repeat) throws Throwable {
//        String[] parameterNames = new LocalVariableTableParameterNameDiscoverer().getParameterNames(((MethodSignature) joinPoint.getSignature()).getMethod());
//        if (Objects.nonNull(repeat)) {
//            // 获取参数
//            Object[] args = joinPoint.getArgs();
//            // 进行一些参数的处理，比如获取订单号，操作人id等
//            StringBuffer lockKeyBuffer = new StringBuffer();
//            String key =getValueBySpEL(repeat.lockKey(), parameterNames, args,"RepeatSubmit").get(0);
//            // 公平加锁，lockTime后锁自动释放
//            boolean isLocked = false;
//            try {
//                isLocked = redissonLockClient.fairLock(key, TimeUnit.SECONDS, repeat.lockTime());
//                // 如果成功获取到锁就继续执行
//                if (isLocked) {
//                    // 执行进程
//                    return joinPoint.proceed();
//                } else {
//                    // 未获取到锁
//                    throw new Exception("请勿重复提交");
//                }
//            } finally {
//                // 如果锁还存在，在方法执行完成后，释放锁
//                if (isLocked) {
//                    redissonLockClient.unlock(key);
//                }
//            }
//        }
//
//        return joinPoint.proceed();
//    }
//
//
//}
